# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import seaborn as sns

class cell: #元胞类
    def __init__(self,U:float):
        self.utility=[U] #创建元胞效用值列表，该列表长度随时间增加
        self.N_utility=-0.5+1/(1+np.exp(-U)) #将N_utility初始化到0至0.5之间
    def minmaxU(self): #效用表最后一位代表现状，使用表中最大值和最小值进行归一
        if (max(self.utility)-min(self.utility))==0:
            pass
        else:
            self.N_utility=(self.utility[-1]-min(self.utility))/(max(self.utility)-min(self.utility))

class cellmap: #元胞列表类
    def __init__(self,N:int):
        self.box=pd.DataFrame(np.zeros([N,N],dtype=float)).applymap(lambda x:cell(x)) #创建元胞表
        self.T=(self.box.applymap(lambda x:x.N_utility).to_numpy()).sum() #初始化温度，定义温度等于从1到N对((ui-ui,min)/(ui,max-ui,min))求和
    def temperature(self): #温度计算函数
        self.box.applymap(lambda x:x.minmaxU()) #归一
        self.T = (self.box.applymap(lambda x: x.N_utility).to_numpy()).sum()
    def plot(self): #热图绘制
        return sns.heatmap(self.box.applymap(lambda x: x.N_utility))


